package com.bestvike.stone.spring.shiro;

import com.bestvike.stone.spring.shiro.annotation.resolver.AnnotationResolver;
import com.bestvike.stone.spring.shiro.auth.Auth;
import com.bestvike.stone.spring.shiro.auth.ShiroException;
import com.bestvike.stone.spring.shiro.authc.AuthenticationToken;
import com.bestvike.stone.spring.shiro.authc.exception.AuthenticationException;
import com.bestvike.stone.spring.shiro.cache.CacheManager;
import com.bestvike.stone.spring.shiro.mgt.SecurityManager;
import com.bestvike.stone.spring.shiro.realm.Realm;

import java.util.Collection;

/**
 * 安全管理器工具类
 */
public final class SecurityUtils {
    private static SecurityManager securityManager;

    private SecurityUtils() {
    }

    /**
     * 获取安全管理器
     */
    private static SecurityManager getSecurityManager() {
        if (securityManager == null)
            throw new ShiroException("securityManager not set");
        return securityManager;
    }

    /**
     * 设置安全管理器
     */
    public static void setSecurityManager(SecurityManager securityManager) {
        SecurityUtils.securityManager = securityManager;
    }

    /**
     * 获取注解解析器
     */
    public static AnnotationResolver getAnnotationResolver() {
        return getSecurityManager().getAnnotationResolver();
    }

    /**
     * 获取缓存管理器
     */
    public static CacheManager getCacheManager() {
        return getSecurityManager().getCacheManager();
    }

    /**
     * 获取认证领域集合
     */
    public static Collection<Realm> getRealms() {
        return getSecurityManager().getRealms();
    }

    /**
     * 登录
     *
     * @param token 登录信息
     * @return 认证结果
     * @throws AuthenticationException 登录失败异常
     */
    public static Auth login(AuthenticationToken token) throws AuthenticationException {
        return getSecurityManager().login(token);
    }

    /**
     * 登出
     *
     * @param token 令牌
     */
    public static void logout(String token) {
        getSecurityManager().logout(token);
    }

    /**
     * 根据上下文令牌从缓存取回授权
     */
    public static Auth fetch() {
        return getSecurityManager().fetch();
    }

    /**
     * 每次授权验证时,再次校验令牌有效性
     */
    public static boolean isAuthenticated() {
        return getSecurityManager().isAuthenticated();
    }

    /**
     * 判断当前上下文是否有指定的全部权限
     *
     * @param permissions 指定的权限
     * @return 有返回 true, 否则返回 false
     */
    public static boolean hasAllPermission(String... permissions) {
        return getSecurityManager().hasAllPermission(permissions);
    }

    /**
     * 判断当前上下文是否有指定的任一权限
     *
     * @param permissions 指定的权限
     * @return 有返回 true, 否则返回 false
     */
    public static boolean hasAnyPermission(String... permissions) {
        return getSecurityManager().hasAnyPermission(permissions);
    }

    /**
     * 判断当前上下文是否有指定的全部角色
     *
     * @param roles 指定的角色
     * @return 有返回 true, 否则返回 false
     */
    public static boolean hasAllRole(String... roles) {
        return getSecurityManager().hasAllRole(roles);
    }

    /**
     * 判断当前上下文是否有指定的任一角色
     *
     * @param roles 指定的角色
     * @return 有返回 true, 否则返回 false
     */
    public static boolean hasAnyRole(String... roles) {
        return getSecurityManager().hasAnyRole(roles);
    }
}
